package com.study.securitydemo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

import static org.springframework.security.config.Customizer.withDefaults;

/**
 * @author weiyongpeng
 * @ClassName: WebSecurityConfig
 * @Description: TODO
 * @date 2024/10/26
 */
@Configuration
//@EnableWebSecurity
public class WebSecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // 开启授权保护
        http.authorizeHttpRequests(
                        authorize -> authorize
                                // 对所有请求进行开启授权保护
                                .anyRequest()
                                // 已认证的请求会被自动授权
                                .authenticated()
                );
        // 自动采用表单认证的方式
        http.formLogin(form -> {
                    form.loginPage("/login").permitAll() // 无需授权既可以访问
                            .usernameParameter("username")
                            .passwordParameter("password")
                            .failureUrl("/login?failure")
                            .successHandler(new MyAuthenticationSuccessHandler()) // 认证成功的处理
                            .failureHandler(new MyAuthenticationFailureHandler()); // 认证失败的处理
                });
        // 注销处理
        http.logout(logout ->{
            logout.logoutSuccessHandler(new MyLogoutSuccessHandler()); // 注销成功时的处理
        });
        // 请求未授权
        http.exceptionHandling(exception -> {
           exception.authenticationEntryPoint(new MyAuthenticationEntryPoint()); // 请求未认证处理
        });
        // 关闭跨站请求攻击保护
        http.csrf(csrf -> csrf.disable());
        // 跨域解决
        http.cors(withDefaults());
        return http.build();
    }

    /**
     * 基于内存的方式创建用户
     * @return
     */
//    @Bean
//    public UserDetailsService userDetailsService(){
//        // 创建基于内存的用户信息管理器
        InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager();
//        // 创建userDetails对象，用于管理用户名，密码，角色，权限等内容
//        inMemoryUserDetailsManager.createUser(
//                                    User.withDefaultPasswordEncoder()
//                                            .username("admin")
//                                            .password("123456")
//                                            .roles("admin")
//                                            .build());
//        return inMemoryUserDetailsManager;
//    }

    /**
     * 基于数据库的方式
     * @return
     */
//    @Bean
//    public UserDetailsService userDetailsService(){
//        // 创建基于内存的用户信息管理器
//        DBUserDetailManager inMemoryUserDetailsManager = new DBUserDetailManager();
//        return inMemoryUserDetailsManager;
//    }
}